package com.tql.mall.product.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tql.mall.common.constant.RedisConstant;
import com.tql.mall.model.product.*;
import com.tql.mall.product.mapper.SkuAttrValueMapper;
import com.tql.mall.product.mapper.SkuImageMapper;
import com.tql.mall.product.mapper.SkuInfoMapper;
import com.tql.mall.product.mapper.SkuSaleAttrValueMapper;
import com.tql.mall.product.service.SkuService;
import com.tql.mall.rabbit.constant.MqConstant;
import com.tql.mall.rabbit.service.RabbitService;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @Author: tyk
 * @Date: 2023/5/22 15:02
 * @Description:
 */
@Service
public class SkuServiceImpl implements SkuService {
    @Autowired
    private SkuInfoMapper skuInfoMapper;
    @Autowired
    private SkuImageMapper skuImageMapper;
    @Autowired
    private SkuAttrValueMapper skuAttrValueMapper;
    @Autowired
    private SkuSaleAttrValueMapper skuSaleAttrValueMapper;
    @Autowired
    private RedissonClient redissonClient;
@Autowired
private RabbitService rabbitService;

    @Override
    public void saveSkuInfo(SkuInfo skuInfo) {
        // 保存skuInfo
        skuInfo.setIsSale(0);
        skuInfoMapper.insert(skuInfo);
        // 保存图片
        for (SkuImage skuImage : skuInfo.getSkuImageList()) {
            // 设置skuId
            skuImage.setSkuId(skuInfo.getId());
            // 保存图片
            skuImageMapper.insert(skuImage);
        }
        // 默认
        // 保存平台属性
        for (SkuAttrValue skuAttrValue : skuInfo.getSkuAttrValueList()) {
            // 设置skuId
            skuAttrValue.setSkuId(skuInfo.getId());
            // 保存
            skuAttrValueMapper.insert(skuAttrValue);
        }
        // 保存销售属性
        for (SkuSaleAttrValue skuSaleAttrValue : skuInfo.getSkuSaleAttrValueList()) {
            // 设置skuId
            skuSaleAttrValue.setSkuId(skuInfo.getId());
            // 设置spuId
            skuSaleAttrValue.setSpuId(skuInfo.getSpuId());
            // 保存
            skuSaleAttrValueMapper.insert(skuSaleAttrValue);
        }
        // 往布隆过滤器添加标记
        RBloomFilter<Object> bloom = redissonClient.getBloomFilter(RedisConstant.BLOOM_FILTER);
        bloom.add(skuInfo.getId());
    }

    @Override
    public IPage<SkuInfo> skuList(Long shopId, Page<SkuInfo> pageInfo) {
        // 排序
        LambdaQueryWrapper<SkuInfo> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SkuInfo::getShopId, shopId).orderByDesc(SkuInfo::getId);
        // 查询
        return skuInfoMapper.selectPage(pageInfo, wrapper);
    }

@Override
public void onSale(Long skuId) {
    // 封装对象
    SkuInfo skuInfo = new SkuInfo();
    skuInfo.setId(skuId);
    skuInfo.setIsSale(1);
    // 修改数据库
    skuInfoMapper.updateById(skuInfo);
    // 修改ES
    rabbitService.sendMsg(MqConstant.EXCHANGE_GOODS, MqConstant.ROUTING_GOODS_ON, skuId);
}

    @Override
    public void offSale(Long skuId) {
        // 封装对象
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);
        skuInfo.setIsSale(0);
        // 修改数据库
        skuInfoMapper.updateById(skuInfo);
        // 修改ES
        rabbitService.sendMsg(MqConstant.EXCHANGE_GOODS, MqConstant.ROUTING_GOODS_OFF, skuId);
    }

    @Override
//    @MallCache(prefix = RedisConstant.SKU_INFO)
    public SkuInfo getSkuInfo(Long skuId) {
        // 查询skuInfo
        SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
        // 查询图片列表
        LambdaQueryWrapper<SkuImage> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(SkuImage::getSkuId, skuId);
        skuInfo.setSkuImageList(skuImageMapper.selectList(wrapper));
        // 返回结果
        return skuInfo;
    }

    @Override
    public BigDecimal getSkuPrice(Long skuId) {
        // 查询价格
        SkuInfo skuInfo = skuInfoMapper.selectById(skuId);
        return skuInfo != null ? skuInfo.getPrice() : new BigDecimal(0);
    }

    @Override
//    @MallCache(prefix = RedisConstant.SPU_VALUE_IDS_MAP)
    public Map getSkuValueIdsMap(Long spuId) {
        // 查询映射
        List<Map> maps = skuSaleAttrValueMapper.selectSkuValueIdsMap(spuId);
        // 数据转换
        Map<Object, Object> res = new HashMap<>();
        for (Map mp : maps)
            res.put(mp.get("value_ids"), mp.get("sku_id"));
        return res;
    }

    @Override
//    @MallCache(prefix = RedisConstant.SKU_BASE_ATTR_INFO)
    public List<BaseAttrInfo> getBaseAttrInfoList(Long skuId) {
        return skuAttrValueMapper.selectBaseAttrInfoList(skuId);
    }

}
